package com.briup.day07;

import java.util.Scanner;

/**
 * 有效的括号
 */
public class ValidParentheses {
    public static void main(String[] args) {
        // 在控制台中输入一个字符串，如何该字符串中
        // 只能包括'('，')'， '{'， '}'，'['，']'
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入包括'('，')'，'{'，'}'，'['，']'的字符串：");
        String s = sc.nextLine();
        // 正则表达式中的+表示左边指定的字符元素在你指定的字符串中至少要有一个
        String regex = "^[({\\[\\]})]+$";
        if (s.matches(regex)) {
            System.out.println("当前输入的字符串符合规则");
        } else {
            System.out.println("当前输入的字符串不符合规则");
        }
        // 进一步判断字符串中的括号是否为有效闭合的
        System.out.println("该字符串是否有效:" + check(s));
    }

    /**
     * 校验字符串中的括号是否有效闭合
     *
     * @param s 字符串
     * @return 校验的结果
     */
    private static boolean check(String s) {
        // 借助于刚刚编写的栈Stack
        Stack stack = new Stack();
        // "({}[)]"
        for (int i = 0; i < s.length(); i++) {
            // 如果当前获取的字符是左边的括号，那么将其右边的括号进行入栈
            if (s.charAt(i) == '(') {
                stack.push(')');
            } else if (s.charAt(i) == '{') {
                stack.push('}');
            } else if (s.charAt(i) == '[') {
                stack.push(']');
            } else {
                if (s.charAt(i) != stack.pop()) {
                    // 如果当前获取的字符与栈区中弹出的字符不相等，那么说明该字符串无效
                    return false;
                }
            }
        }
        return stack.size == 0;
    }
}
